CSS Tree Shaking:去除项目代码中用不到的CSS样式,仅保留被使用的样式代码。
PurifyCSS
PurifyCSS可以用来进行CSS Tree Shaking
。为了能准确指明要进行Tree Shaking的CSS文件,还需要用到glob-all
(另一个第三方库)。
glob-all
的作用就是:帮助PurifyCSS进行路径处理,定位要做Tree Shaking的路径文件。
具体配置如下:
const PurifyCSS = require("purifycss-webpack");
const glob = require("glob-all");
const purifyCSS = new PurifyCSS({
paths: glob.sync([
// 要做CSS Tree Shaking的路径文件
path.resolve(__dirname, "./*.html"),
path.resolve(__dirname, "./src/*.js")
])
});
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
demo实战
装包
yarn add webpack webpack-cli glob-all purifycss-webpack purify-css css-loader style-loader mini-css-extract-plugin --dev
1
项目目录
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>CSS Tree Shaking</title>
<link rel="stylesheet" href="./dist/main.css">
</head>
<body>
<div id="root">
<div class="big"></div>
</div>
<script src="./dist/bundle.js"></script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
index.js
import './style/index.css';
const root = document.querySelector('#root');
const div = document.createElement('div');
div.className = 'box';
root.appendChild(div);
1
2
3
4
5
6
2
3
4
5
6
html {
background: red;
}
.box {
height: 200px;
width: 200px;
border-radius: 3px;
background: green;
}
.big {
height: 300px;
width: 300px;
border-radius: 5px;
background: red;
}
.small {
height: 100px;
width: 100px;
border-radius: 2px;
background: yellow;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
需要注意:
.small
样式并没有使用到。 webpack.config.js:
const path = require("path");
const PurifyCSS = require("purifycss-webpack");
const glob = require("glob-all");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
module.exports = {
mode: 'none',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: 'bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css-loader'],
},
],
},
plugins: [
new MiniCssExtractPlugin({filename: "[name].css", chunkFilename: "[id].css"}),
new PurifyCSS({
paths: glob.sync([
// 要做CSS Tree Shaking的路径文件
path.resolve(__dirname, "./*.html"), // 请注意,我们同样需要对 html 文件进行 tree shaking
path.resolve(__dirname, "./src/*.js")
])
})
]
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
运行webpack打包:
我们在index.html和./src/index.js中引用的样式都被打包了,而没有被使用的样式类small
没有出现在打包后的css文件中,CSS Tree Shaking
成功。